package org.cybzacg.convert.strategy;


import org.cybzacg.convert.context.ConversionContext;
import org.cybzacg.convert.core.TypeConverter;
import org.cybzacg.convert.enums.ConversionStrategyEnum;
import org.cybzacg.convert.exception.ConversionException;

/**
 * 转换策略接口
 * 定义不同的转换执行策略
 *
 * @author cybzacg.blog
 * @version 3.0
 * @since 3.0
 */
public interface ConversionStrategy {

    /**
     * 执行转换
     *
     * @param <T>          目标类型
     * @param converter    转换器
     * @param source       源对象
     * @param targetType   目标类型
     * @param defaultValue 默认值
     * @param context      转换上下文
     * @return 转换结果
     * @throws ConversionException 转换失败时抛出
     */
    <T> T execute(
            TypeConverter converter,
            Object source,
            Class<T> targetType,
            T defaultValue,
            ConversionContext context
    ) throws ConversionException;

    /**
     * 获取策略名称
     *
     * @return 策略名称
     */
    ConversionStrategyEnum getName();

    /**
     * 获取策略描述
     *
     * @return 策略描述
     */
    String getDescription();

    /**
     * 检查是否支持指定的转换上下文
     *
     * @param context 转换上下文
     * @return 是否支持
     */
    boolean supports(ConversionContext context);
}
